package com.swingsane.preferences;
import java.util.Locale;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.attribute.standard.Media;
import javax.print.attribute.standard.MediaSizeName;
import org.apache.log4j.Logger;
import org.imgscalr.Scalr.Rotation;
import com.swingsane.business.options.KnownSaneOptions;
import com.swingsane.preferences.model.Scanner;
public class PreferredDefaultsImpl implements IPreferredDefaults {
/**
* Log4J logger.
*/
private static final Logger LOG = Logger.getLogger(PreferredDefaultsImpl.class);
private ColorMode color = ColorMode.BLACK_AND_WHITE;
private String pageSize;
private int pagesToScan = 1;
private int resolution = DEFAULT_RESOLUTION;
private Source source = Source.AUTOMATIC_DOCUMENT_FEEDER;
@Override
public final ColorMode getColor() {
return color;
}
@Override
public double getDefaultDeskewThreshold() {
return IPreferredDefaults.DEFAULT_DESKEW_THRESHOLD;
}
@Override
public int getDefaultLuminanceThreshold() {
return IPreferredDefaults.DEFAULT_LUMINANCE_THRESHOLD;
}
@Override
public Rotation getDefaultRotation() {
return IPreferredDefaults.DEFAULT_ROTATION;
}
@Override
public final int getResolution() {
return resolution;
}
private boolean isA4PaperSize() {
String timezone = System.getProperty("user.timezone");
if ((timezone != null) && (timezone.length() > 0)) {
return !System.getProperty("user.timezone").startsWith("America");
}
try {
PrintService pservice = PrintServiceLookup.lookupDefaultPrintService();
Object obj = pservice.getDefaultAttributeValue(Media.class);
if (obj instanceof MediaSizeName) {
MediaSizeName mediaSizeName = (MediaSizeName) obj;
return mediaSizeName.equals(MediaSizeName.ISO_A4);
}
} catch (Exception ex) {
LOG.info(ex.getLocalizedMessage());
}
String country = Locale.getDefault().getCountry();
if ((country.equals("US")) || (country.equals("CA"))) {
return false;
}
// default to true
return true;
}
@Override
public final void setColor(ColorMode color) {
this.color = color;
}
@Override
public final void setResolution(int resolution) {
this.resolution = resolution;
}
private void udpateBlackThreshold(Scanner scanner) {
KnownSaneOptions.setBlackThreshold(scanner, 0);
}
@Override
public final void update(Scanner scanner) {
updateResolution(scanner);
updateSource(scanner);
updatePagesSize(scanner);
updateColorMode(scanner);
udpateBlackThreshold(scanner);
updateUsingDefaultBlackThreshold(scanner);
updateDuplexScanning(scanner);
updateAutoCrop(scanner);
updateADFAutoScan(scanner);
updatePagesToScan(scanner);
updateUseCustomOptions(scanner);
}
private void updateADFAutoScan(Scanner scanner) {
KnownSaneOptions.setBatchScan(scanner, true);
}
private void updateAutoCrop(Scanner scanner) {
KnownSaneOptions.setAutoCrop(scanner, false);
}
private void updateColorMode(Scanner scanner) {
KnownSaneOptions.setDefaultColorMode(scanner, color);
}
private void updateDuplexScanning(Scanner scanner) {
KnownSaneOptions.setDuplex(scanner, false);
}
private void updatePagesSize(Scanner scanner) {
if (pageSize != null) {
KnownSaneOptions.setDefaultScanArea(scanner, pageSize);
} else if (isA4PaperSize()) {
KnownSaneOptions.setDefaultScanArea(scanner, "A4");
} else {
KnownSaneOptions.setDefaultScanArea(scanner, "Letter");
}
}
private void updatePagesToScan(Scanner scanner) {
scanner.setPagesToScan(pagesToScan);
}
private void updateResolution(Scanner scanner) {
KnownSaneOptions.setResolution(scanner, resolution);
}
private void updateSource(Scanner scanner) {
KnownSaneOptions.setDefaultSource(scanner, source);
}
private void updateUseCustomOptions(Scanner scanner) {
scanner.setUsingCustomOptions(false);
}
private void updateUsingDefaultBlackThreshold(Scanner scanner) {
KnownSaneOptions.setUsingDefaultBlackThreshold(scanner, true);
}
}